/* 
 * File:   Grafico.cpp
 * Author: mm021791
 * 
 * Created on 26 de septiembre de 2012, 13:11
 */

#include "Grafico.h"

using TP::Grafica::Grafico;

Grafico::Grafico() {}

Grafico::~Grafico() {
    
    this->liberar();
}

long int Grafico::ancho(){
    
    // Se debe clacular el ancho en funcion de las imagenes declaradas.
    long int columna = 0;
    Posicion* offset = this->Offset();
    IGraficable* cursor = (IGraficable*) this->imagenes.Primero();
    
    while (NULL != cursor)
    {
        if (cursor->getPosicionGrafica().getColumna() + offset->getColumna() + cursor->width()> columna)
            columna = cursor->getPosicionGrafica().getColumna() + offset->getColumna() + cursor->width();
        cursor = (IGraficable*) this->imagenes.Siguiente(cursor);
    }
    delete offset;
    return columna;
}

long int Grafico::alto(){
    // Se debe clacular el alto en funcion de las imagenes declaradas.

    long int fila = 0;
    Posicion* offset = this->Offset();
    IGraficable* cursor = (IGraficable*) this->imagenes.Primero();
    
    while (NULL != cursor)
    {
        if (cursor->getPosicionGrafica().getFila() + offset->getFila() + cursor->height() > fila)
            fila = cursor->getPosicionGrafica().getFila() + offset->getFila() + cursor->height();
        cursor = (IGraficable*) this->imagenes.Siguiente(cursor);
    }
    delete offset;
    return fila;    
}

Posicion* Grafico::Offset() {

    // Calculo el offset.
    long int fila = 0
           , columna = 0;
    
    IGraficable* grafica = (IGraficable*)this->imagenes.Primero();

    while (NULL != grafica)
    {
        if (grafica->getPosicionGrafica().getFila() < fila)
            fila = grafica->getPosicionGrafica().getFila();

        if (grafica->getPosicionGrafica().getColumna() < columna)
            columna = grafica->getPosicionGrafica().getColumna();
        
        grafica = (IGraficable*) this->imagenes.Siguiente(grafica);
    }
    return new Posicion (-fila, -columna, ROTACION_NULA);
}

const IGraficable& Grafico::addGraficable (IGraficable* pGraficable){
    
    if (NULL != pGraficable)
        this->imagenes.Agregar(pGraficable);
    
    return *pGraficable;
}

BMP* Grafico::toBMP() {
    
    BMP* bmp = new BMP (this->ancho(), this->alto());
    Posicion* offset = this->Offset();
    
    // Para toda grafica en Imagenes => Dibugo la grafica en el pixel.
    IGraficable* grafica = (IGraficable*) this->imagenes.Primero();
    
    while (NULL != grafica)
    {
        // Dibujo la grafica en el BMP.
        for (long int i = 0; i < grafica->height(); i++)
            for (long int j = 0; j < grafica->width(); j++)
            {
                // Calculo la posicion de la grafica en el BMP.
                Posicion pos (grafica->getPosicionGrafica() + *offset);
                
                // Agrego el pixel al BMP.
                bmp->setPixel(pos.getFila() + i, pos.getColumna() + j, &grafica->getPixel(i, j));
            }
        grafica = (IGraficable*) this->imagenes.Siguiente(grafica);
    }
    delete offset;
    return bmp;
}

void Grafico::liberar(){
    this->imagenes.Limpiar();
}

